/*
 * 装饰模式是比较好玩，也比较有意义。其实就我个人看来，它和责任链还是蛮像的。
 *
 * 只不过一个是比较判断，一个是迭代处理。装饰模式就是那种迭代处理的模式，关键在哪呢？
 *
 * 我们可以看看数据结构。
 */
typedef struct object
{
	struct object *prev;
	void (*decorate)(struct object * pobject);
}object;

/*
 * 装饰模式最经典的地方就是把pObject这个值放在了数据结构里面。
 *
 * 当然，装饰模式的奥妙还不仅仅在这个地方，还有一个地方就是迭代处理。
 *
 * 我们可以自己随便写一个decorate函数试试看
 */
void decorate(struct object * pobject)
{
	assert(NULL != pobject);

	if (NULL != pobject->prev)
		pobject->prev->decorate(pobject->prev);

	printf("normal decorate!\n");
}

/* 
 * 所以，装饰模式的最重要的两个方面就体现在：prev参数和decorate迭代处理
 */